package com.ceadeal.admin.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * 功能描述: 浮点计算工具类
 *
 * 作者: Yzw
 * 日期: 2017-03-08 10:14:53
 */
public class DoubleUtil {

    private static final int roundingMode = BigDecimal.ROUND_DOWN;
    private static final int defaultScale = 2;

    /**
     * 进行加法运算（Double）
     * @param value1 加数
     * @param value2 被加数
     * @return
     */
    public static double add(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.add(b2).setScale(defaultScale, roundingMode).doubleValue();
    }

    /**
     * 进行加法运算（BigDecimal）
     * @param value1 被加数
     * @param value2 加数
     * @return
     */
    public static BigDecimal add(BigDecimal value1, BigDecimal value2) {
        return value1.add(value2).setScale(defaultScale, roundingMode);
    }

    /**
     * 进行减法运算（Double）
     * @param value1 被减数
     * @param value2 减数
     * @return
     */
    public static double sub(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.subtract(b2).setScale(defaultScale, roundingMode).doubleValue();
    }

    /**
     * 进行减法运算（BigDecimal）
     * @param value1
     * @param value2
     * @return
     */
    public static BigDecimal sub(BigDecimal value1, BigDecimal value2) {
        return value1.subtract(value2).setScale(defaultScale, roundingMode);
    }

    /**
     * 进行乘法运算（Double）
     * @param value1 被乘数
     * @param value2 乘数
     * @return
     */
    public static double mul(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.multiply(b2).setScale(defaultScale, roundingMode).doubleValue();
    }

    /**
     * 进行乘法运算（BigDecimal）
     * @param value1 被乘数
     * @param value2 乘数
     * @return
     */
    public static BigDecimal mul(BigDecimal value1, BigDecimal value2) {
        return value1.multiply(value2).setScale(defaultScale, roundingMode);
    }

    /**
     * 进行除法运算
     * @param value1 被除数
     * @param value2 除数
     * @param scale
     * @return
     */
    public static double div(double value1, double value2, int scale) {
        if (scale < 0) {
            scale = defaultScale;
        }
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.divide(b2, scale, roundingMode).doubleValue();
    }

    /**
     * 不进行四舍五入 保留小数点后2位（Double）
     * @param value
     * @return
     */
    public static double scale(double value) {
        BigDecimal decimal = new BigDecimal(Double.toString(value));
        return decimal.setScale(defaultScale, roundingMode).doubleValue();
    }

    /**
     * 不进行四舍五入，保留指定小数位
     * @param value
     * @param scale
     * @return
     */
    public static double scale(double value, int scale) {
        BigDecimal decimal = new BigDecimal(Double.toString(value));
        return decimal.setScale(scale, roundingMode).doubleValue();
    }

    /**
     * 不进行四舍五入 只保留小数点后2位（BigDecimal）
     * @param value
     * @return
     */
    public static BigDecimal scale(BigDecimal value) {
        return value.setScale(defaultScale, roundingMode);
    }

    public static BigDecimal scale(BigDecimal value, int scale) {
        if (scale < 0) {
            scale = defaultScale;
        }
        return value.setScale(scale, roundingMode);
    }

    /**
     * 功能描述: 2个double比较大小
     * 结果等于 0 value1 = value2
     * 结果大于 0 value1 > value2
     * 结果小于 0 value1 < value2
     * @param value1
     * @param value2
     * @return
     */
    public static int doubleCompare(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.compareTo(b2);
    }

    /**
     *
     * @param value
     * @return
     */
    public static String toDecimalString2(double value) {
        String formatStr = "#0.00";
        return new DecimalFormat(formatStr).format(value);
    }

}
